Overview¶
- Part 1: Introduction (15 min)
- Issues with remote sensing (RS) data
- What is STAC?
- What is PySTAC?
- Part 2: Code demo (30 min)
- Finding buildings in the Palisades Fire area in LA using Sentinel-2 data
- Part 3: Hands-on (45 min+)
- Finding burned buildings in the Palisades Fire area in LA using Sentinel-2 data
First...¶
Let's make sure all of you have the relevant notebook and files. You have two options:
- Google Colab
- Clone from Github
Google Colab¶
Go to https://github.com/maybemkl/gic-rs-tutorials.
Make sure you have the relevant files on your instance. These should include:
- A folder called "data"
- A folder called "img"
- A .py file called "utiles.py"
- A .py file called spectral_indexes.py
If you do not have them:
- Download them from https://www.mediafire.com/file/656ulooyxizybxc/pystac_files.zip/file
- Upload them to the Google Colab
Git Pull¶
Go to https://github.com/maybemkl/gic-rs-tutorials and follow the instructions there.
Part 1: Introduction¶
Remote Sensing¶
Remote sensing is the process of detecting and collecting information of the physical characteristics of or on the Earth without making contact with the area.
There are today more than 10,000 (as of July 2024) satellites orbiting the Earth. They gather data at various resolutions (including very fine).
Most of these satellites are private, a significant amount owned or operated by StarLink.
- At least 1,052 “earth observations”
Remote Sensing Data¶
Remote sensing data is often stored in very large image files of high-resolution formats like .tif.
Storing and processing this data in very unwieldy. This is where tools and platforms like STAC, Google Earth Engine (GEE), and Microsoft Planetary Computer (MPC) come in. They provide data standards (STAC) or cloud computing resources (GEE, MPC).
STAC: Spatio-Temporal Asset Catalog¶
A "common language to describe geospatial information". No processing capabilities, not a cloud service like GEE or MPC (which uses STAC). STAC is all about standardizing metadata for geospatial data, enabling better data discovery and interoperability.
Provides standards for storing, indexing, and accessing geospatial data in general and satellite RS data in particular. We can "postpone" the actual processing until the very last step by relying on interconnected metadata instead.
JSON-files that are organized in a hierarchy:
- Item (images for bands in a given area, e.g. a Sentinel-2 scene from a specific bbox)
- Collection (sets of images from a given source, e.g. Sentinel-2 and LandSat)
- Catalog (a list of data sources)
STAC: Item¶
A STAC Item represents *one* captured image, e.g., a Sentinel-2 scene over New York on 2024-06-15.
Source: The STAC Specification
STAC: Item¶
If this was your STAC item, you could choose "assets" within this bbox, including and RGB image or specific "bands" (red, blue, green, but also near infrared, short-wave infrared, etc.).
Source: The STAC Specification
STAC: Collection¶
A STAC Collection groups multiple images from the same source (e.g. Sentinel-2 ) together. It defines shared metadata like temporal coverage and data sources.
Source: The STAC Specification
STAC: Catalog¶
A STAC Catalog is a higher-level structure that links different collections (e.g., Sentinel-2, Landsat, NAIP).
Source: The STAC Specification
STAC: Catalog¶
A STAC catalog has its own specification in something like catalog.json. In addition to collections, it can include individual items.
Source: The STAC Specification
STAC: Programming Languages and Frameworks¶
- Python: pystac
- JavaScript: stac-server
- Rust: stac-rs
- R: rstac
- QGIS: qgis-stac-plugin
PySTAC¶
The most actively maintained and comprehensive framework for accessing STAC assets. Provides tools for searching, filtering, and accessing dozens of STAC catalogs.
Additionally, offers in-memory manipulations of STAC catalogs: Load and work with STAC catalog data as Python objects entirely within your computer's memory. Data loaded like this is by default in the xarray format, but we will often convert it to numpy for the sake of simplicity.
An overview of catalogs can be found here. Today we will be using Earth Search by Amazon owned Element84.
Part 2: Code Demo¶
Part 2A: Preamble¶
The LA 2025 Fires¶
- From January 7th to 31st
- Killed 28+ people (wite 31+ more still missing) and forced 200,000+ to evacuate
- Destroyed 18,189+ buildings
- Concentrated in the Altadena and Pacific Palisades neighborhoods
Our Case Study: The Palisades Fire¶
- Pacific Palisades
- Killed 12 people (with 7 more still missing) and forced 105,000 to evacuate
- Destroyed 6,837 buildings, damaged 1,017
Our Case Study: The Palisades Fire¶
- Researchers at CUNY and Oregon State University used data from the Sentinel-1 and Sentinel-2 satellites to assess the damage
- We will try to replicate part of the study by using Sentinel-2 data
Source: How and Why a CUNY Graduate Center Student Maps the Devastation of Wildfires and War
At the end, we will have replicated this map to produce a very close estimate using only spectral indexes:
Spectral Indexes¶
Spectral indexes are mathematical formulas used in remote sensing to highlight specific surface features in satellite images. By comparing different wavelengths of reflected light, these indexes help identify patterns such as vegetation growth, water presence, urban areas, or burned regions.
For instance: The Normalized Difference Vegetation Index (NDVI) measures vegetation health by comparing NIR and Red reflectance. Higher values indicate healthy vegetation, while lower values suggest bare soil, water, or built-up areas.
$NDVI = \frac{\text{NIR} - \text{Red}}{\text{NIR} + \text{Red}}$
Spectral Indexes for Analysing Structural Fire Damage¶
For our analysis, we want to:
- Preprocess by removing big bodies of water such as the ocean
- Identify buildings
- Identify areas that were burned after the fire
- Find the overlap between buildings and burned areas
Removing water: NDWI¶
The Normalized Difference Water Index (NDWI) highlights water bodies by comparing Green and NIR reflectance. Higher values indicate water, while lower values represent vegetation or soil.
$NDWI = \frac{\text{Green} - \text{NIR}}{\text{Green} + \text{NIR}}$
Identifying buildings: NDBI and IBI¶
The Normalized Difference Built-up Index (NDBI) is used to identify and distinguish built-up areas like cities and urban environments. Higher positive values indicate more built-up areas:
$NDBI = \frac{\text{SWIR}_1 - \text{NIR}}{\text{SWIR}_1 + \text{NIR}}$
IBI improves upon NDBI by combining multiple spectral signals, offering a more nuanced and accurate depiction of built-up areas, especially in mixed landscapes. Higher IBI als indicate more built-up areas:
$IBI = \frac{\text{NDBI} - (\text{NDVI} + \text{NDWI})}{\text{NDBI} + (\text{NDVI} + \text{NDWI})}$
Today, we will use IBI.
Identifying burns: NBR and dNBR¶
NBR is used to detect burned areas and assess fire severity by comparing Near-Infrared (NIR) and Shortwave Infrared (SWIR-2) reflectance. Healthy vegetation has high NIR reflectance and low SWIR-2 reflectance, while burned areas show the opposite pattern. Higher NBR values indicate healthy vegetation, while lower values indicate burned or barren land.
$NBR = \frac{\text{NIR} - \text{SWIR}_2}{\text{NIR} + \text{SWIR}_2}$
By comparing the pre-fire and post-fire NBR, we can get a sense of what areas were ravaged by the fire:
$\mathrm{dNBR} = \mathrm{NBR}_{\text{pre}} - \mathrm{NBR}_{\text{post}}$
Designed for vegetation, so not ideal. But we will see it works quite well! This is why the CUNY study uses SAR data from Sentinel-1 instead. However, SAR is a lot more complicated so not suitable for quick-and-dirty workshop :)
Workflow¶
In order to estimate and visualize these indexes for the Palisades, we will go through the following workflow.
Accessing catalogues
- pystac_client
Browsing and filtering
- pystac
- shapely
Loading and processing data
- odc-stac
- xarray
- numpy
Visualizing data
- ipyleaflet
- geopandas
- matplotlib
Part 2B: Coding¶
Install and load libraries¶
import folium
import geopandas as gpd
import ipyleaflet
import matplotlib.pyplot as plt
import pystac_client
import shapely
from IPython.display import Image
from odc.stac import stac_load
from shapely import Polygon
from shapely.geometry import box
from tqdm import tqdm
%load_ext autoreload
%autoreload 2
The autoreload extension is already loaded. To reload it, use: %reload_ext autoreload
Load helper functions¶
from utils import *
Access and browse the catalog¶
- PyStac allows us to directly access some of these resources as they are stored by actors such as AWS, Google, and Microsoft.
- We will use data as provided by the AWS affiliated company Element84.
- There are a few other providers that give access to the same data.
sentinel_client = pystac_client.Client.open("https://earth-search.aws.element84.com/v1")
sentinel_client
- type "Catalog"
- id "earth-search-aws"
- stac_version "1.1.0"
- description "A STAC API of public datasets on AWS"
links[] 21 items
0
- rel "self"
- href "https://earth-search.aws.element84.com/v1"
- type "application/json"
1
- rel "root"
- href "https://earth-search.aws.element84.com/v1"
- type "application/json"
- title "Earth Search by Element 84"
2
- rel "conformance"
- href "https://earth-search.aws.element84.com/v1/conformance"
- type "application/json"
3
- rel "data"
- href "https://earth-search.aws.element84.com/v1/collections"
- type "application/json"
4
- rel "search"
- href "https://earth-search.aws.element84.com/v1/search"
- type "application/geo+json"
- method "GET"
5
- rel "search"
- href "https://earth-search.aws.element84.com/v1/search"
- type "application/geo+json"
- method "POST"
6
- rel "aggregate"
- href "https://earth-search.aws.element84.com/v1/aggregate"
- type "application/json"
- method "GET"
7
- rel "aggregations"
- href "https://earth-search.aws.element84.com/v1/aggregations"
- type "application/json"
8
- rel "service-desc"
- href "https://earth-search.aws.element84.com/v1/api"
- type "application/vnd.oai.openapi"
9
- rel "service-doc"
- href "https://earth-search.aws.element84.com/v1/api.html"
- type "text/html"
10
- rel "http://www.opengis.net/def/rel/ogc/1.0/queryables"
- href "https://earth-search.aws.element84.com/v1/queryables"
- type "application/schema+json"
11
- rel "server"
- href "https://stac-utils.github.io/stac-server/"
- type "text/html"
12
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-pre-c1-l2a"
- type "application/geo+json"
13
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/cop-dem-glo-30"
- type "application/geo+json"
14
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/naip"
- type "application/geo+json"
15
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/cop-dem-glo-90"
- type "application/geo+json"
16
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/landsat-c2-l2"
- type "application/geo+json"
17
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
- type "application/geo+json"
18
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l1c"
- type "application/geo+json"
19
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
- type "application/geo+json"
20
- rel "child"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-1-grd"
- type "application/geo+json"
conformsTo[] 14 items
- 0 "https://api.stacspec.org/v1.0.0/core"
- 1 "https://api.stacspec.org/v1.0.0/collections"
- 2 "https://api.stacspec.org/v1.0.0/ogcapi-features"
- 3 "https://api.stacspec.org/v1.0.0/item-search"
- 4 "https://api.stacspec.org/v1.0.0/ogcapi-features#fields"
- 5 "https://api.stacspec.org/v1.0.0/ogcapi-features#sort"
- 6 "https://api.stacspec.org/v1.0.0/ogcapi-features#query"
- 7 "https://api.stacspec.org/v1.0.0/item-search#fields"
- 8 "https://api.stacspec.org/v1.0.0/item-search#sort"
- 9 "https://api.stacspec.org/v1.0.0/item-search#query"
- 10 "https://api.stacspec.org/v0.3.0/aggregation"
- 11 "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/core"
- 12 "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/oas30"
- 13 "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/geojson"
- title "Earth Search by Element 84"
Once we've established the connection to Element84, we can check what data and from which satellites do we have access to.
collections = list(sentinel_client.get_collections())
n_collections = len(collections)
print(f"There are {n_collections} collections:\n")
for c in collections:
print(c.id)
There are 9 collections: sentinel-2-pre-c1-l2a cop-dem-glo-30 naip cop-dem-glo-90 landsat-c2-l2 sentinel-2-l2a sentinel-2-l1c sentinel-2-c1-l2a sentinel-1-grd
There are three different satellites
- Data from the Sentinel missions of the Copernicus program:
sentinel-2-pre-c1-l2a,sentinel-2-l2a,sentinel-2-l1c,sentinel-2-c1-l2a,sentinel-1-grd - Data from the TanDEM-X mission of the Copernicus program:
cop-dem-glo-30&cop-dem-glo-90 - Data from the National Agriculture Imagery Program (NAIP):
naip - Data from the Landsat program:
landsat-c2-l2
Sentinel-2¶
We will use the sentinel-2-l2a dataset. This dataset has a few advantegous properties. It is:
- Available at a good resolution. 10 m, 20 m, and 60 m depending on wavelength
- Uses a MultiSpectral Instrument (MSI) with 13 bands: 4 visible bands, 6 Near-Infrared bands, 3 Short-Wave Infrared bands
- Available at a frequent interval: Collected every 5 days
- Available at
"l2a", i.e. atmospherically corrected surfance reflectance
Moreover:
- It is available at land and coastal areas between latitudes 56°S and 83°N
- Global data available since January 2017, some local patches since October 2016
collection = "sentinel-2-l2a"
Explore the available data¶
This data is available almost "real time". We can, for instance, easily get data for January and February in February of the year this was written (2025).
date = "2025-02-01/2025-02-25"
Before accessing the satellite data, we have to choose a specific area of interest (AOI). We can use the package ipyleaflet to visualize a point in the Wet'suwet'en territory.
height = 600
width = 1200
m = ipyleaflet.Map()
m.center = 34.05, -118.55
m.zoom = 14
m.layout.height = str(height) + "px"
m.layout.width = str(width) + "px"
m
Map(center=[34.05, -118.55], controls=(ZoomControl(options=['position', 'zoom_in_text', 'zoom_in_title', 'zoom…

This preview can directly be used to get the "bounding box" (bbox) of our AOI.
bbox=[m.west, m.south, m.east, m.north]
Now, using this bbox and our dates of interest, we can retrieve information about the images that are available for that AOI at that time.
We run our query with three filters we want images with
- less than 20% of their pixels missing.
- less than 20% degraded spectral data.
- less than 20% cloud cover.
Additionally, we recommend the service return only 5 images.
query = ["s2:nodata_pixel_percentage<20",
"s2:degraded_msi_data_percentage<20",
"eo:cloud_cover<20"]
%%time
item_search_t1 = sentinel_client.search(collections=[collection], # Filter by collection
datetime=date, # Filter by date
bbox=bbox, # Filter by area
query=query, # Filter by quality
limit=5) # Limit n returned images to 5
CPU times: user 299 µs, sys: 2 µs, total: 301 µs Wall time: 304 µs
What we get in return is a PyStac ItemSearch. This is like getting the search results of Google. You haven't yet loaded the data of the websites returned by your search, only some data about each website.
Similarly, we now have data about the relevant items, not yet the items nor their assets.
Why? Because these assets are HUGE images! You could easily end up downloading tens of gigabytes by accident.
item_search_t1.item_collection()
- type "FeatureCollection"
features[] 2 items
0
- type "Feature"
- stac_version "1.1.0"
stac_extensions[] 8 items
- 0 "https://stac-extensions.github.io/grid/v1.1.0/schema.json"
- 1 "https://stac-extensions.github.io/view/v1.0.0/schema.json"
- 2 "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json"
- 3 "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
- 4 "https://stac-extensions.github.io/eo/v1.1.0/schema.json"
- 5 "https://stac-extensions.github.io/raster/v1.1.0/schema.json"
- 6 "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json"
- 7 "https://stac-extensions.github.io/processing/v1.1.0/schema.json"
- id "S2C_11SLT_20250221_0_L2A"
geometry
- type "Polygon"
coordinates[] 1 items
0[] 5 items
0[] 2 items
- 0 -119.17376896599782
- 1 34.32235671057083
1[] 2 items
- 0 -119.14885662021419
- 1 33.33277630652224
2[] 2 items
- 0 -117.96938626406873
- 1 33.34758667242361
3[] 2 items
- 0 -117.98063319821665
- 1 34.33772750342932
4[] 2 items
- 0 -119.17376896599782
- 1 34.32235671057083
bbox[] 4 items
- 0 -119.173769
- 1 33.332776
- 2 -117.969386
- 3 34.337728
properties
- created "2025-02-22T01:53:43.505Z"
- platform "sentinel-2c"
- constellation "sentinel-2"
instruments[] 1 items
- 0 "msi"
- eo:cloud_cover 4.984134
- proj:code "EPSG:32611"
proj:centroid
- lat 33.83606
- lon -118.56814
- mgrs:utm_zone 11
- mgrs:latitude_band "S"
- mgrs:grid_square "LT"
- grid:code "MGRS-11SLT"
- view:azimuth 102.12176753134347
- view:incidence_angle 4.749574361931863
- view:sun_azimuth 152.371295355222
- view:sun_elevation 41.754986507204
- s2:tile_id "S2C_OPER_MSI_L2A_TL_2CPS_20250222T001111_A002428_T11SLT_N05.11"
- s2:degraded_msi_data_percentage 0.0213
- s2:nodata_pixel_percentage 0
- s2:saturated_defective_pixel_percentage 0
- s2:cloud_shadow_percentage 0.002472
- s2:vegetation_percentage 8.055272
- s2:not_vegetated_percentage 33.023557
- s2:water_percentage 53.660136
- s2:unclassified_percentage 0.036198
- s2:medium_proba_clouds_percentage 1.612118
- s2:high_proba_clouds_percentage 2.46034
- s2:thin_cirrus_percentage 0.911676
- s2:snow_ice_percentage 0.004967
- s2:product_type "S2MSI2A"
- s2:processing_baseline "05.11"
- s2:product_uri "S2C_MSIL2A_20250221T183421_N0511_R027_T11SLT_20250222T001111.SAFE"
- s2:generation_time "2025-02-22T00:11:11.000000Z"
- s2:datatake_id "GS2C_20250221T183421_002428_N05.11"
- s2:datatake_type "INS-NOBS"
- s2:datastrip_id "S2C_OPER_MSI_L2A_DS_2CPS_20250222T001111_S20250221T183723_N05.11"
- s2:reflectance_conversion_factor 1.02408600818865
- datetime "2025-02-21T18:45:25.463000Z"
- s2:sequence "0"
- earthsearch:s3_path "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A"
- earthsearch:payload_id "roda-sentinel2/workflow-sentinel2-to-stac/a6889564d8b608340f2dfb2ae9d8b496"
- earthsearch:boa_offset_applied True
processing:software
- sentinel2-to-stac "0.1.1"
- updated "2025-02-22T01:53:43.505Z"
links[] 8 items
0
- rel "self"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250221_0_L2A"
- type "application/geo+json"
1
- rel "canonical"
- href "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/S2C_11SLT_20250221_0_L2A.json"
- type "application/json"
2
- rel "license"
- href "https://sentinel.esa.int/documents/247904/690755/Sentinel_Data_Legal_Notice"
3
- rel "derived_from"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l1c/items/S2C_11SLT_20250221_0_L1C"
- type "application/geo+json"
4
- rel "parent"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
- type "application/json"
5
- rel "collection"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
- type "application/json"
6
- rel "root"
- href "https://earth-search.aws.element84.com/v1"
- type "application/json"
- title "Earth Search by Element 84"
7
- rel "thumbnail"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250221_0_L2A/thumbnail"
assets
aot
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/AOT.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Aerosol optical thickness (AOT)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
blue
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B02.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Blue - 10m"
eo:bands[] 1 items
0
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
cloud
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/qi/CLD_20m.jp2"
- type "image/jp2"
- title "Cloud Probabilities"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 2 items
- 0 "data"
- 1 "cloud"
coastal
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B01.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Coastal - 60m"
eo:bands[] 1 items
0
- name "B01"
- common_name "coastal"
- center_wavelength 0.443
- full_width_half_max 0.027
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
granule_metadata
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/granule_metadata.xml"
- type "application/xml"
roles[] 1 items
- 0 "metadata"
green
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B03.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Green - 10m"
eo:bands[] 1 items
0
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B08.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 1 - 10m"
eo:bands[] 1 items
0
- name "B08"
- common_name "nir"
- center_wavelength 0.842
- full_width_half_max 0.145
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir08
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B8A.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 2 - 20m"
eo:bands[] 1 items
0
- name "B8A"
- common_name "nir08"
- center_wavelength 0.865
- full_width_half_max 0.033
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir09
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B09.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 3 - 60m"
eo:bands[] 1 items
0
- name "B09"
- common_name "nir09"
- center_wavelength 0.945
- full_width_half_max 0.026
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
product_metadata
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/product_metadata.xml"
- type "application/xml"
roles[] 1 items
- 0 "metadata"
red
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B04.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red - 10m"
eo:bands[] 1 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge1
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B05.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 1 - 20m"
eo:bands[] 1 items
0
- name "B05"
- common_name "rededge"
- center_wavelength 0.704
- full_width_half_max 0.019
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge2
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B06.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 2 - 20m"
eo:bands[] 1 items
0
- name "B06"
- common_name "rededge"
- center_wavelength 0.74
- full_width_half_max 0.018
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge3
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B07.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 3 - 20m"
eo:bands[] 1 items
0
- name "B07"
- common_name "rededge"
- center_wavelength 0.783
- full_width_half_max 0.028
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
scl
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/SCL.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Scene classification map (SCL)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 1 items
- 0 "data"
snow
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/qi/SNW_20m.jp2"
- type "image/jp2"
- title "Snow Probabilities"
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 2 items
- 0 "data"
- 1 "snow-ice"
swir16
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B11.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "SWIR 1.6μm - 20m"
eo:bands[] 1 items
0
- name "B11"
- common_name "swir16"
- center_wavelength 1.61
- full_width_half_max 0.143
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
swir22
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B12.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "SWIR 2.2μm - 20m"
eo:bands[] 1 items
0
- name "B12"
- common_name "swir22"
- center_wavelength 2.19
- full_width_half_max 0.242
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
tileinfo_metadata
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/tileinfo_metadata.json"
- type "application/json"
roles[] 1 items
- 0 "metadata"
visual
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/TCI.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "True color image"
eo:bands[] 3 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
1
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
2
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
raster:bands[] 3 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 10
1
- nodata 0
- data_type "uint8"
- spatial_resolution 10
2
- nodata 0
- data_type "uint8"
- spatial_resolution 10
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
roles[] 1 items
- 0 "visual"
wvp
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/WVP.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Water Vapour (WVP)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- unit "cm"
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
thumbnail
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/preview.jpg"
- type "image/jpeg"
- title "Thumbnail of preview image"
roles[] 1 items
- 0 "thumbnail"
aot-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/AOT.jp2"
- type "image/jp2"
- title "Aerosol optical thickness (AOT)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
blue-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B02.jp2"
- type "image/jp2"
- title "Blue - 10m"
eo:bands[] 1 items
0
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
coastal-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R60m/B01.jp2"
- type "image/jp2"
- title "Coastal - 60m"
eo:bands[] 1 items
0
- name "B01"
- common_name "coastal"
- center_wavelength 0.443
- full_width_half_max 0.027
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
green-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B03.jp2"
- type "image/jp2"
- title "Green - 10m"
eo:bands[] 1 items
0
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B08.jp2"
- type "image/jp2"
- title "NIR 1 - 10m"
eo:bands[] 1 items
0
- name "B08"
- common_name "nir"
- center_wavelength 0.842
- full_width_half_max 0.145
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir08-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B8A.jp2"
- type "image/jp2"
- title "NIR 2 - 20m"
eo:bands[] 1 items
0
- name "B8A"
- common_name "nir08"
- center_wavelength 0.865
- full_width_half_max 0.033
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir09-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R60m/B09.jp2"
- type "image/jp2"
- title "NIR 3 - 60m"
eo:bands[] 1 items
0
- name "B09"
- common_name "nir09"
- center_wavelength 0.945
- full_width_half_max 0.026
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
red-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B04.jp2"
- type "image/jp2"
- title "Red - 10m"
eo:bands[] 1 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge1-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B05.jp2"
- type "image/jp2"
- title "Red Edge 1 - 20m"
eo:bands[] 1 items
0
- name "B05"
- common_name "rededge"
- center_wavelength 0.704
- full_width_half_max 0.019
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge2-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B06.jp2"
- type "image/jp2"
- title "Red Edge 2 - 20m"
eo:bands[] 1 items
0
- name "B06"
- common_name "rededge"
- center_wavelength 0.74
- full_width_half_max 0.018
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge3-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B07.jp2"
- type "image/jp2"
- title "Red Edge 3 - 20m"
eo:bands[] 1 items
0
- name "B07"
- common_name "rededge"
- center_wavelength 0.783
- full_width_half_max 0.028
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
scl-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/SCL.jp2"
- type "image/jp2"
- title "Scene classification map (SCL)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 1 items
- 0 "data"
swir16-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B11.jp2"
- type "image/jp2"
- title "SWIR 1.6μm - 20m"
eo:bands[] 1 items
0
- name "B11"
- common_name "swir16"
- center_wavelength 1.61
- full_width_half_max 0.143
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
swir22-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B12.jp2"
- type "image/jp2"
- title "SWIR 2.2μm - 20m"
eo:bands[] 1 items
0
- name "B12"
- common_name "swir22"
- center_wavelength 2.19
- full_width_half_max 0.242
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
visual-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/TCI.jp2"
- type "image/jp2"
- title "True color image"
eo:bands[] 3 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
1
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
2
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
raster:bands[] 3 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 10
1
- nodata 0
- data_type "uint8"
- spatial_resolution 10
2
- nodata 0
- data_type "uint8"
- spatial_resolution 10
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
roles[] 1 items
- 0 "visual"
wvp-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/WVP.jp2"
- type "image/jp2"
- title "Water Vapour (WVP)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- unit "cm"
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
- collection "sentinel-2-l2a"
1
- type "Feature"
- stac_version "1.1.0"
stac_extensions[] 8 items
- 0 "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json"
- 1 "https://stac-extensions.github.io/processing/v1.1.0/schema.json"
- 2 "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
- 3 "https://stac-extensions.github.io/view/v1.0.0/schema.json"
- 4 "https://stac-extensions.github.io/grid/v1.1.0/schema.json"
- 5 "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json"
- 6 "https://stac-extensions.github.io/raster/v1.1.0/schema.json"
- 7 "https://stac-extensions.github.io/eo/v1.1.0/schema.json"
- id "S2C_11SLT_20250201_0_L2A"
geometry
- type "Polygon"
coordinates[] 1 items
0[] 5 items
0[] 2 items
- 0 -119.17376896599782
- 1 34.32235671057083
1[] 2 items
- 0 -119.14885662021419
- 1 33.33277630652224
2[] 2 items
- 0 -117.96938626406873
- 1 33.34758667242361
3[] 2 items
- 0 -117.98063319821665
- 1 34.33772750342932
4[] 2 items
- 0 -119.17376896599782
- 1 34.32235671057083
bbox[] 4 items
- 0 -119.173769
- 1 33.332776
- 2 -117.969386
- 3 34.337728
properties
- created "2025-02-19T00:09:21.000Z"
- platform "sentinel-2c"
- constellation "sentinel-2"
instruments[] 1 items
- 0 "msi"
- eo:cloud_cover 15.756986
- proj:code "EPSG:32611"
proj:centroid
- lat 33.83606
- lon -118.56814
- mgrs:utm_zone 11
- mgrs:latitude_band "S"
- mgrs:grid_square "LT"
- grid:code "MGRS-11SLT"
- view:azimuth 102.54679884013262
- view:incidence_angle 4.643661733025623
- view:sun_azimuth 155.533090805397
- view:sun_elevation 35.6300744226208
- s2:tile_id "S2C_OPER_MSI_L2A_TL_2CPS_20250201T210315_A002142_T11SLT_N05.11"
- s2:degraded_msi_data_percentage 0.0213
- s2:nodata_pixel_percentage 0
- s2:saturated_defective_pixel_percentage 0
- s2:cloud_shadow_percentage 0.311144
- s2:vegetation_percentage 6.128278
- s2:not_vegetated_percentage 28.111815
- s2:water_percentage 48.687729
- s2:unclassified_percentage 0.019642
- s2:medium_proba_clouds_percentage 1.772476
- s2:high_proba_clouds_percentage 0.166605
- s2:thin_cirrus_percentage 13.817903
- s2:snow_ice_percentage 0.0122
- s2:product_type "S2MSI2A"
- s2:processing_baseline "05.11"
- s2:product_uri "S2C_MSIL2A_20250201T183631_N0511_R027_T11SLT_20250201T210315.SAFE"
- s2:generation_time "2025-02-01T21:03:15.000000Z"
- s2:datatake_id "GS2C_20250201T183631_002142_N05.11"
- s2:datatake_type "INS-NOBS"
- s2:datastrip_id "S2C_OPER_MSI_L2A_DS_2CPS_20250201T210315_S20250201T184431_N05.11"
- s2:reflectance_conversion_factor 1.03095298204146
- datetime "2025-02-01T18:45:30.242000Z"
- s2:sequence "0"
- earthsearch:s3_path "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A"
- earthsearch:payload_id "roda-sentinel2/workflow-sentinel2-to-stac/64ae91a21d030b823f41a5305c24b91e"
- earthsearch:boa_offset_applied True
processing:software
- sentinel2-to-stac "0.1.1"
- updated "2025-02-19T00:09:21.000Z"
links[] 8 items
0
- rel "self"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250201_0_L2A"
- type "application/geo+json"
1
- rel "canonical"
- href "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/S2C_11SLT_20250201_0_L2A.json"
- type "application/json"
2
- rel "license"
- href "https://sentinel.esa.int/documents/247904/690755/Sentinel_Data_Legal_Notice"
3
- rel "derived_from"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l1c/items/S2C_11SLT_20250201_0_L1C"
- type "application/geo+json"
4
- rel "parent"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
- type "application/json"
5
- rel "collection"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
- type "application/json"
6
- rel "root"
- href "https://earth-search.aws.element84.com/v1"
- type "application/json"
- title "Earth Search by Element 84"
7
- rel "thumbnail"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250201_0_L2A/thumbnail"
assets
aot
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/AOT.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Aerosol optical thickness (AOT)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
blue
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B02.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Blue - 10m"
eo:bands[] 1 items
0
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
cloud
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/qi/CLD_20m.jp2"
- type "image/jp2"
- title "Cloud Probabilities"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 2 items
- 0 "data"
- 1 "cloud"
coastal
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B01.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Coastal - 60m"
eo:bands[] 1 items
0
- name "B01"
- common_name "coastal"
- center_wavelength 0.443
- full_width_half_max 0.027
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
granule_metadata
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/granule_metadata.xml"
- type "application/xml"
roles[] 1 items
- 0 "metadata"
green
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B03.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Green - 10m"
eo:bands[] 1 items
0
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B08.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 1 - 10m"
eo:bands[] 1 items
0
- name "B08"
- common_name "nir"
- center_wavelength 0.842
- full_width_half_max 0.145
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir08
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B8A.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 2 - 20m"
eo:bands[] 1 items
0
- name "B8A"
- common_name "nir08"
- center_wavelength 0.865
- full_width_half_max 0.033
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir09
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B09.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 3 - 60m"
eo:bands[] 1 items
0
- name "B09"
- common_name "nir09"
- center_wavelength 0.945
- full_width_half_max 0.026
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
product_metadata
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/product_metadata.xml"
- type "application/xml"
roles[] 1 items
- 0 "metadata"
red
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B04.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red - 10m"
eo:bands[] 1 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge1
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B05.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 1 - 20m"
eo:bands[] 1 items
0
- name "B05"
- common_name "rededge"
- center_wavelength 0.704
- full_width_half_max 0.019
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge2
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B06.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 2 - 20m"
eo:bands[] 1 items
0
- name "B06"
- common_name "rededge"
- center_wavelength 0.74
- full_width_half_max 0.018
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge3
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B07.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 3 - 20m"
eo:bands[] 1 items
0
- name "B07"
- common_name "rededge"
- center_wavelength 0.783
- full_width_half_max 0.028
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
scl
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/SCL.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Scene classification map (SCL)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 1 items
- 0 "data"
snow
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/qi/SNW_20m.jp2"
- type "image/jp2"
- title "Snow Probabilities"
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 2 items
- 0 "data"
- 1 "snow-ice"
swir16
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B11.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "SWIR 1.6μm - 20m"
eo:bands[] 1 items
0
- name "B11"
- common_name "swir16"
- center_wavelength 1.61
- full_width_half_max 0.143
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
swir22
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/B12.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "SWIR 2.2μm - 20m"
eo:bands[] 1 items
0
- name "B12"
- common_name "swir22"
- center_wavelength 2.19
- full_width_half_max 0.242
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
tileinfo_metadata
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/tileinfo_metadata.json"
- type "application/json"
roles[] 1 items
- 0 "metadata"
visual
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/TCI.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "True color image"
eo:bands[] 3 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
1
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
2
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
raster:bands[] 3 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 10
1
- nodata 0
- data_type "uint8"
- spatial_resolution 10
2
- nodata 0
- data_type "uint8"
- spatial_resolution 10
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
roles[] 1 items
- 0 "visual"
wvp
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/WVP.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Water Vapour (WVP)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- unit "cm"
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
thumbnail
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250201_0_L2A/preview.jpg"
- type "image/jpeg"
- title "Thumbnail of preview image"
roles[] 1 items
- 0 "thumbnail"
aot-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/AOT.jp2"
- type "image/jp2"
- title "Aerosol optical thickness (AOT)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
blue-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/B02.jp2"
- type "image/jp2"
- title "Blue - 10m"
eo:bands[] 1 items
0
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
coastal-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R60m/B01.jp2"
- type "image/jp2"
- title "Coastal - 60m"
eo:bands[] 1 items
0
- name "B01"
- common_name "coastal"
- center_wavelength 0.443
- full_width_half_max 0.027
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
green-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/B03.jp2"
- type "image/jp2"
- title "Green - 10m"
eo:bands[] 1 items
0
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/B08.jp2"
- type "image/jp2"
- title "NIR 1 - 10m"
eo:bands[] 1 items
0
- name "B08"
- common_name "nir"
- center_wavelength 0.842
- full_width_half_max 0.145
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir08-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B8A.jp2"
- type "image/jp2"
- title "NIR 2 - 20m"
eo:bands[] 1 items
0
- name "B8A"
- common_name "nir08"
- center_wavelength 0.865
- full_width_half_max 0.033
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir09-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R60m/B09.jp2"
- type "image/jp2"
- title "NIR 3 - 60m"
eo:bands[] 1 items
0
- name "B09"
- common_name "nir09"
- center_wavelength 0.945
- full_width_half_max 0.026
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
red-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/B04.jp2"
- type "image/jp2"
- title "Red - 10m"
eo:bands[] 1 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge1-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B05.jp2"
- type "image/jp2"
- title "Red Edge 1 - 20m"
eo:bands[] 1 items
0
- name "B05"
- common_name "rededge"
- center_wavelength 0.704
- full_width_half_max 0.019
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge2-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B06.jp2"
- type "image/jp2"
- title "Red Edge 2 - 20m"
eo:bands[] 1 items
0
- name "B06"
- common_name "rededge"
- center_wavelength 0.74
- full_width_half_max 0.018
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge3-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B07.jp2"
- type "image/jp2"
- title "Red Edge 3 - 20m"
eo:bands[] 1 items
0
- name "B07"
- common_name "rededge"
- center_wavelength 0.783
- full_width_half_max 0.028
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
scl-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/SCL.jp2"
- type "image/jp2"
- title "Scene classification map (SCL)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 1 items
- 0 "data"
swir16-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B11.jp2"
- type "image/jp2"
- title "SWIR 1.6μm - 20m"
eo:bands[] 1 items
0
- name "B11"
- common_name "swir16"
- center_wavelength 1.61
- full_width_half_max 0.143
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
swir22-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/B12.jp2"
- type "image/jp2"
- title "SWIR 2.2μm - 20m"
eo:bands[] 1 items
0
- name "B12"
- common_name "swir22"
- center_wavelength 2.19
- full_width_half_max 0.242
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
visual-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R10m/TCI.jp2"
- type "image/jp2"
- title "True color image"
eo:bands[] 3 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
1
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
2
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
raster:bands[] 3 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 10
1
- nodata 0
- data_type "uint8"
- spatial_resolution 10
2
- nodata 0
- data_type "uint8"
- spatial_resolution 10
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
roles[] 1 items
- 0 "visual"
wvp-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/1/0/R20m/WVP.jp2"
- type "image/jp2"
- title "Water Vapour (WVP)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- unit "cm"
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
- collection "sentinel-2-l2a"
item_collection_t1 = item_search_t1.item_collection()
n_items_t1 = len(item_collection_t1)
n_items_t1
2
Before downloading the actual images, we can use the geopandas, shapely, and folium packages the size and various properties of our images of interest.
Here, we look at the water percentage of each image. It's an arbitrary attribute, but it shows how the images correspond to the underlying map.
gdf = gpd.GeoDataFrame.from_features(
item_collection_t1.to_dict(),
crs="EPSG:4326"
)
bbox_geom = shapely.geometry.mapping(shapely.geometry.box(*bbox))
bbox_layer = folium.GeoJson(bbox_geom)
m = gdf.explore(column="eo:cloud_cover")
bbox_layer.add_to(m)
m
The search itself is a generator object that includes metadata for all the items returned for the query.
item_search_t1.items()
<generator object ItemSearch.items at 0x15aa9fbc0>
list(item_search_t1.items())
[<Item id=S2C_11SLT_20250221_0_L2A>, <Item id=S2C_11SLT_20250201_0_L2A>]
Using a custom function, we can print some attributes of each image.
print_item_search_attributes(item_search_t1)
2 items found: ID: S2C_11SLT_20250221_0_L2A Cloud cover (%): 4.984134 Missing pixels (%): 0 Missing band data (%): 0.0213 Image area (km^2): 1.17 ID: S2C_11SLT_20250201_0_L2A Cloud cover (%): 15.756986 Missing pixels (%): 0 Missing band data (%): 0.0213 Image area (km^2): 1.17
Time 1: Working with one item¶
Before working with the whole set of items, let's take a look at just one image. We'll pick the one with the least cloud cover. This is our "$t_1$", data from the current moment or "time one".
items_t1 = list(item_collection_t1)
min_cloud_t1 = get_item_with_min_attribute(items_t1, attr='eo:cloud_cover')
min_cloud_t1.properties['datetime']
'2025-02-21T18:45:25.463000Z'
Before loading the item, we can access a low resolution "thumbnail" image to preview it.
Image(url=min_cloud_t1.assets["thumbnail"].href, width=400)
The image is very low res, but it gives us a sense of what's to come. Notice that it's a lot bigger than our area of interest.
Item Assets ($t_1$)¶
Each item comes with several "assets", which broadly speaking are images at different wavelengths and resolutions.
print_assets(min_cloud_t1)
aot | Aerosol optical thickness (AOT) blue | Blue - 10m cloud | Cloud Probabilities coastal | Coastal - 60m granule_metadata | None green | Green - 10m nir | NIR 1 - 10m nir08 | NIR 2 - 20m nir09 | NIR 3 - 60m product_metadata | None red | Red - 10m rededge1 | Red Edge 1 - 20m rededge2 | Red Edge 2 - 20m rededge3 | Red Edge 3 - 20m scl | Scene classification map (SCL) snow | Snow Probabilities swir16 | SWIR 1.6μm - 20m swir22 | SWIR 2.2μm - 20m tileinfo_metadata | None visual | True color image wvp | Water Vapour (WVP) thumbnail | Thumbnail of preview image aot-jp2 | Aerosol optical thickness (AOT) blue-jp2 | Blue - 10m coastal-jp2 | Coastal - 60m green-jp2 | Green - 10m nir-jp2 | NIR 1 - 10m nir08-jp2 | NIR 2 - 20m nir09-jp2 | NIR 3 - 60m red-jp2 | Red - 10m rededge1-jp2 | Red Edge 1 - 20m rededge2-jp2 | Red Edge 2 - 20m rededge3-jp2 | Red Edge 3 - 20m scl-jp2 | Scene classification map (SCL) swir16-jp2 | SWIR 1.6μm - 20m swir22-jp2 | SWIR 2.2μm - 20m visual-jp2 | True color image wvp-jp2 | Water Vapour (WVP)
Selecting Assets and Area ($t_1$)¶
Recall, that we are interested in four different indexes (NDVI, NDWI, IBI, NBR) as well as RGB imagery. To compile these, we select the following bands:
- RGB (red, green, blue), i.e. "standard" photography
- Two bands of short-wave infrared (SWIR16, SWIR22) and near infrared (NIR)
We can select them from the Sentinel-2 data with the following query words:
selected_bands = ["swir16", "swir22","nir","red","green","blue"]
All of these are available at either the 10m or 20m resolution!
Getting the appropriate polygon ($t_1$)¶
We are still only dealing with descriptions of our data, not the actual data.
Before we load the data, recall that the images of interestet were MUCH larger than our area of interest. So we want to filter and only load part of each image.
To do this, we find the intersection polygons between (1) each image of interest and (2) the total area of interest.
For our example image, the bounds of the image can be found like this, using the Python package shapely:
min_cloud_t1_poly = Polygon(*min_cloud_t1.geometry['coordinates'])
min_cloud_t1_poly
For the bbox of our total AOI, like this:
bbox_poly = box(*bbox)
bbox_poly
Now, we can use shapely to find their intersection.
intersection_poly = shapely.intersection(
bbox_poly,
min_cloud_t1_poly)
intersection_poly
For our example image, this is the part of the image that we want to retrieve!
min_cloud_t1.geometry
{'type': 'Polygon',
'coordinates': [[[-119.17376896599782, 34.32235671057083],
[-119.14885662021419, 33.33277630652224],
[-117.96938626406873, 33.34758667242361],
[-117.98063319821665, 34.33772750342932],
[-119.17376896599782, 34.32235671057083]]]}
min_cloud_t1
- type "Feature"
- stac_version "1.1.0"
stac_extensions[] 8 items
- 0 "https://stac-extensions.github.io/grid/v1.1.0/schema.json"
- 1 "https://stac-extensions.github.io/view/v1.0.0/schema.json"
- 2 "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json"
- 3 "https://stac-extensions.github.io/projection/v2.0.0/schema.json"
- 4 "https://stac-extensions.github.io/eo/v1.1.0/schema.json"
- 5 "https://stac-extensions.github.io/raster/v1.1.0/schema.json"
- 6 "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json"
- 7 "https://stac-extensions.github.io/processing/v1.1.0/schema.json"
- id "S2C_11SLT_20250221_0_L2A"
geometry
- type "Polygon"
coordinates[] 1 items
0[] 5 items
0[] 2 items
- 0 -119.17376896599782
- 1 34.32235671057083
1[] 2 items
- 0 -119.14885662021419
- 1 33.33277630652224
2[] 2 items
- 0 -117.96938626406873
- 1 33.34758667242361
3[] 2 items
- 0 -117.98063319821665
- 1 34.33772750342932
4[] 2 items
- 0 -119.17376896599782
- 1 34.32235671057083
bbox[] 4 items
- 0 -119.173769
- 1 33.332776
- 2 -117.969386
- 3 34.337728
properties
- created "2025-02-22T01:53:43.505Z"
- platform "sentinel-2c"
- constellation "sentinel-2"
instruments[] 1 items
- 0 "msi"
- eo:cloud_cover 4.984134
- proj:code "EPSG:32611"
proj:centroid
- lat 33.83606
- lon -118.56814
- mgrs:utm_zone 11
- mgrs:latitude_band "S"
- mgrs:grid_square "LT"
- grid:code "MGRS-11SLT"
- view:azimuth 102.12176753134347
- view:incidence_angle 4.749574361931863
- view:sun_azimuth 152.371295355222
- view:sun_elevation 41.754986507204
- s2:tile_id "S2C_OPER_MSI_L2A_TL_2CPS_20250222T001111_A002428_T11SLT_N05.11"
- s2:degraded_msi_data_percentage 0.0213
- s2:nodata_pixel_percentage 0
- s2:saturated_defective_pixel_percentage 0
- s2:cloud_shadow_percentage 0.002472
- s2:vegetation_percentage 8.055272
- s2:not_vegetated_percentage 33.023557
- s2:water_percentage 53.660136
- s2:unclassified_percentage 0.036198
- s2:medium_proba_clouds_percentage 1.612118
- s2:high_proba_clouds_percentage 2.46034
- s2:thin_cirrus_percentage 0.911676
- s2:snow_ice_percentage 0.004967
- s2:product_type "S2MSI2A"
- s2:processing_baseline "05.11"
- s2:product_uri "S2C_MSIL2A_20250221T183421_N0511_R027_T11SLT_20250222T001111.SAFE"
- s2:generation_time "2025-02-22T00:11:11.000000Z"
- s2:datatake_id "GS2C_20250221T183421_002428_N05.11"
- s2:datatake_type "INS-NOBS"
- s2:datastrip_id "S2C_OPER_MSI_L2A_DS_2CPS_20250222T001111_S20250221T183723_N05.11"
- s2:reflectance_conversion_factor 1.02408600818865
- datetime "2025-02-21T18:45:25.463000Z"
- s2:sequence "0"
- earthsearch:s3_path "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A"
- earthsearch:payload_id "roda-sentinel2/workflow-sentinel2-to-stac/a6889564d8b608340f2dfb2ae9d8b496"
- earthsearch:boa_offset_applied True
processing:software
- sentinel2-to-stac "0.1.1"
- updated "2025-02-22T01:53:43.505Z"
links[] 8 items
0
- rel "self"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250221_0_L2A"
- type "application/geo+json"
1
- rel "canonical"
- href "s3://sentinel-cogs/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/S2C_11SLT_20250221_0_L2A.json"
- type "application/json"
2
- rel "license"
- href "https://sentinel.esa.int/documents/247904/690755/Sentinel_Data_Legal_Notice"
3
- rel "derived_from"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l1c/items/S2C_11SLT_20250221_0_L1C"
- type "application/geo+json"
4
- rel "parent"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
- type "application/json"
5
- rel "collection"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a"
- type "application/json"
6
- rel "root"
- href "https://earth-search.aws.element84.com/v1"
- type "application/json"
- title "Earth Search by Element 84"
7
- rel "thumbnail"
- href "https://earth-search.aws.element84.com/v1/collections/sentinel-2-l2a/items/S2C_11SLT_20250221_0_L2A/thumbnail"
assets
aot
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/AOT.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Aerosol optical thickness (AOT)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
blue
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B02.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Blue - 10m"
eo:bands[] 1 items
0
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
cloud
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/qi/CLD_20m.jp2"
- type "image/jp2"
- title "Cloud Probabilities"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 2 items
- 0 "data"
- 1 "cloud"
coastal
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B01.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Coastal - 60m"
eo:bands[] 1 items
0
- name "B01"
- common_name "coastal"
- center_wavelength 0.443
- full_width_half_max 0.027
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
granule_metadata
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/granule_metadata.xml"
- type "application/xml"
roles[] 1 items
- 0 "metadata"
green
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B03.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Green - 10m"
eo:bands[] 1 items
0
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B08.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 1 - 10m"
eo:bands[] 1 items
0
- name "B08"
- common_name "nir"
- center_wavelength 0.842
- full_width_half_max 0.145
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir08
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B8A.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 2 - 20m"
eo:bands[] 1 items
0
- name "B8A"
- common_name "nir08"
- center_wavelength 0.865
- full_width_half_max 0.033
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir09
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B09.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "NIR 3 - 60m"
eo:bands[] 1 items
0
- name "B09"
- common_name "nir09"
- center_wavelength 0.945
- full_width_half_max 0.026
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
product_metadata
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/product_metadata.xml"
- type "application/xml"
roles[] 1 items
- 0 "metadata"
red
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B04.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red - 10m"
eo:bands[] 1 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge1
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B05.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 1 - 20m"
eo:bands[] 1 items
0
- name "B05"
- common_name "rededge"
- center_wavelength 0.704
- full_width_half_max 0.019
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge2
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B06.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 2 - 20m"
eo:bands[] 1 items
0
- name "B06"
- common_name "rededge"
- center_wavelength 0.74
- full_width_half_max 0.018
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge3
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B07.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Red Edge 3 - 20m"
eo:bands[] 1 items
0
- name "B07"
- common_name "rededge"
- center_wavelength 0.783
- full_width_half_max 0.028
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
scl
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/SCL.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Scene classification map (SCL)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 1 items
- 0 "data"
snow
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/qi/SNW_20m.jp2"
- type "image/jp2"
- title "Snow Probabilities"
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 2 items
- 0 "data"
- 1 "snow-ice"
swir16
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B11.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "SWIR 1.6μm - 20m"
eo:bands[] 1 items
0
- name "B11"
- common_name "swir16"
- center_wavelength 1.61
- full_width_half_max 0.143
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
swir22
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/B12.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "SWIR 2.2μm - 20m"
eo:bands[] 1 items
0
- name "B12"
- common_name "swir22"
- center_wavelength 2.19
- full_width_half_max 0.242
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
tileinfo_metadata
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/tileinfo_metadata.json"
- type "application/json"
roles[] 1 items
- 0 "metadata"
visual
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/TCI.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "True color image"
eo:bands[] 3 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
1
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
2
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
raster:bands[] 3 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 10
1
- nodata 0
- data_type "uint8"
- spatial_resolution 10
2
- nodata 0
- data_type "uint8"
- spatial_resolution 10
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
roles[] 1 items
- 0 "visual"
wvp
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/WVP.tif"
- type "image/tiff; application=geotiff; profile=cloud-optimized"
- title "Water Vapour (WVP)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- unit "cm"
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
thumbnail
- href "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/11/S/LT/2025/2/S2C_11SLT_20250221_0_L2A/preview.jpg"
- type "image/jpeg"
- title "Thumbnail of preview image"
roles[] 1 items
- 0 "thumbnail"
aot-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/AOT.jp2"
- type "image/jp2"
- title "Aerosol optical thickness (AOT)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
blue-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B02.jp2"
- type "image/jp2"
- title "Blue - 10m"
eo:bands[] 1 items
0
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
coastal-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R60m/B01.jp2"
- type "image/jp2"
- title "Coastal - 60m"
eo:bands[] 1 items
0
- name "B01"
- common_name "coastal"
- center_wavelength 0.443
- full_width_half_max 0.027
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
green-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B03.jp2"
- type "image/jp2"
- title "Green - 10m"
eo:bands[] 1 items
0
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B08.jp2"
- type "image/jp2"
- title "NIR 1 - 10m"
eo:bands[] 1 items
0
- name "B08"
- common_name "nir"
- center_wavelength 0.842
- full_width_half_max 0.145
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir08-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B8A.jp2"
- type "image/jp2"
- title "NIR 2 - 20m"
eo:bands[] 1 items
0
- name "B8A"
- common_name "nir08"
- center_wavelength 0.865
- full_width_half_max 0.033
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
nir09-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R60m/B09.jp2"
- type "image/jp2"
- title "NIR 3 - 60m"
eo:bands[] 1 items
0
- name "B09"
- common_name "nir09"
- center_wavelength 0.945
- full_width_half_max 0.026
- gsd 60
proj:shape[] 2 items
- 0 1830
- 1 1830
proj:transform[] 6 items
- 0 60
- 1 0
- 2 300000
- 3 0
- 4 -60
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 60
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
red-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/B04.jp2"
- type "image/jp2"
- title "Red - 10m"
eo:bands[] 1 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 10
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge1-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B05.jp2"
- type "image/jp2"
- title "Red Edge 1 - 20m"
eo:bands[] 1 items
0
- name "B05"
- common_name "rededge"
- center_wavelength 0.704
- full_width_half_max 0.019
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge2-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B06.jp2"
- type "image/jp2"
- title "Red Edge 2 - 20m"
eo:bands[] 1 items
0
- name "B06"
- common_name "rededge"
- center_wavelength 0.74
- full_width_half_max 0.018
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
rededge3-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B07.jp2"
- type "image/jp2"
- title "Red Edge 3 - 20m"
eo:bands[] 1 items
0
- name "B07"
- common_name "rededge"
- center_wavelength 0.783
- full_width_half_max 0.028
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
scl-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/SCL.jp2"
- type "image/jp2"
- title "Scene classification map (SCL)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 20
roles[] 1 items
- 0 "data"
swir16-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B11.jp2"
- type "image/jp2"
- title "SWIR 1.6μm - 20m"
eo:bands[] 1 items
0
- name "B11"
- common_name "swir16"
- center_wavelength 1.61
- full_width_half_max 0.143
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
swir22-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/B12.jp2"
- type "image/jp2"
- title "SWIR 2.2μm - 20m"
eo:bands[] 1 items
0
- name "B12"
- common_name "swir22"
- center_wavelength 2.19
- full_width_half_max 0.242
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- scale 0.0001
- offset -0.1
roles[] 2 items
- 0 "data"
- 1 "reflectance"
visual-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R10m/TCI.jp2"
- type "image/jp2"
- title "True color image"
eo:bands[] 3 items
0
- name "B04"
- common_name "red"
- center_wavelength 0.665
- full_width_half_max 0.038
1
- name "B03"
- common_name "green"
- center_wavelength 0.56
- full_width_half_max 0.045
2
- name "B02"
- common_name "blue"
- center_wavelength 0.49
- full_width_half_max 0.098
raster:bands[] 3 items
0
- nodata 0
- data_type "uint8"
- spatial_resolution 10
1
- nodata 0
- data_type "uint8"
- spatial_resolution 10
2
- nodata 0
- data_type "uint8"
- spatial_resolution 10
- gsd 10
proj:shape[] 2 items
- 0 10980
- 1 10980
proj:transform[] 6 items
- 0 10
- 1 0
- 2 300000
- 3 0
- 4 -10
- 5 3800040
roles[] 1 items
- 0 "visual"
wvp-jp2
- href "s3://sentinel-s2-l2a/tiles/11/S/LT/2025/2/21/0/R20m/WVP.jp2"
- type "image/jp2"
- title "Water Vapour (WVP)"
- gsd 20
proj:shape[] 2 items
- 0 5490
- 1 5490
proj:transform[] 6 items
- 0 20
- 1 0
- 2 300000
- 3 0
- 4 -20
- 5 3800040
raster:bands[] 1 items
0
- nodata 0
- data_type "uint16"
- spatial_resolution 20
- unit "cm"
- scale 0.001
- offset 0
roles[] 1 items
- 0 "data"
- collection "sentinel-2-l2a"
Load the Item into Memory ($t_1$)¶
To reiterate.
To actually get the data and not just a description of it, we need to "load" it.
- We only pick the relevant bands
- We limit the image to the intersection polygon
- We lower the resolution
Now we can actually retrieve our example image using the stac_load function from the helper library odc.stac. This returns an xarray dataset.
data_t1 = stac_load([min_cloud_t1],
bands = selected_bands,
bbox=intersection_poly.bounds,
crs="EPSG:32611",
chunks={},
#resolution=0.5, #could be as low as 0.00009009
progress=tqdm).isel(time=0)
data_t1
<xarray.Dataset> Size: 6MB
Dimensions: (y: 489, x: 959)
Coordinates:
* y (y) float64 4kB 3.771e+06 3.771e+06 ... 3.766e+06 3.766e+06
* x (x) float64 8kB 3.521e+05 3.522e+05 ... 3.617e+05 3.617e+05
spatial_ref int32 4B 32611
time datetime64[ns] 8B 2025-02-21T18:45:25.463000
Data variables:
swir16 (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
swir22 (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
nir (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
red (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
green (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
blue (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>- y: 489
- x: 959
- y(y)float643.771e+06 3.771e+06 ... 3.766e+06
- units :
- metre
- resolution :
- -10.0
- crs :
- EPSG:32611
array([3771225., 3771215., 3771205., ..., 3766365., 3766355., 3766345.])
- x(x)float643.521e+05 3.522e+05 ... 3.617e+05
- units :
- metre
- resolution :
- 10.0
- crs :
- EPSG:32611
array([352145., 352155., 352165., ..., 361705., 361715., 361725.])
- spatial_ref()int3232611
- spatial_ref :
- PROJCRS["WGS 84 / UTM zone 11N",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 120°W and 114°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - Alberta; British Columbia (BC); Northwest Territories (NWT); Nunavut. Mexico. United States (USA)."],BBOX[0,-120,84,-114]],ID["EPSG",32611]]
- crs_wkt :
- PROJCRS["WGS 84 / UTM zone 11N",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 120°W and 114°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - Alberta; British Columbia (BC); Northwest Territories (NWT); Nunavut. Mexico. United States (USA)."],BBOX[0,-120,84,-114]],ID["EPSG",32611]]
- semi_major_axis :
- 6378137.0
- semi_minor_axis :
- 6356752.314245179
- inverse_flattening :
- 298.257223563
- reference_ellipsoid_name :
- WGS 84
- longitude_of_prime_meridian :
- 0.0
- prime_meridian_name :
- Greenwich
- geographic_crs_name :
- WGS 84
- horizontal_datum_name :
- World Geodetic System 1984 ensemble
- projected_crs_name :
- WGS 84 / UTM zone 11N
- grid_mapping_name :
- transverse_mercator
- latitude_of_projection_origin :
- 0.0
- longitude_of_central_meridian :
- -117.0
- false_easting :
- 500000.0
- false_northing :
- 0.0
- scale_factor_at_central_meridian :
- 0.9996
- GeoTransform :
- 352140 10 0 3771230 0 -10
array(32611, dtype=int32)
- time()datetime64[ns]2025-02-21T18:45:25.463000
array('2025-02-21T18:45:25.463000000', dtype='datetime64[ns]')
- swir16(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - swir22(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - nir(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - red(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - green(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - blue(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray
- yPandasIndex
PandasIndex(Index([3771225.0, 3771215.0, 3771205.0, 3771195.0, 3771185.0, 3771175.0, 3771165.0, 3771155.0, 3771145.0, 3771135.0, ... 3766435.0, 3766425.0, 3766415.0, 3766405.0, 3766395.0, 3766385.0, 3766375.0, 3766365.0, 3766355.0, 3766345.0], dtype='float64', name='y', length=489)) - xPandasIndex
PandasIndex(Index([352145.0, 352155.0, 352165.0, 352175.0, 352185.0, 352195.0, 352205.0, 352215.0, 352225.0, 352235.0, ... 361635.0, 361645.0, 361655.0, 361665.0, 361675.0, 361685.0, 361695.0, 361705.0, 361715.0, 361725.0], dtype='float64', name='x', length=959))
RGB visualization ($t_1$)¶
Normally, RGB data is expressed on the 0 to 255 or 0 to 1 range. That's no the case with Sentinel-2 data, so we normalize it into the 0, 255 range.
normalized_rgb_t1 = normalize_to_rgb(data_t1)
normalized_rgb_t1.shape
(489, 959, 3)
Now we can get a regular RGB image of the intersection polygon we are interested in.
fig, ax = plt.subplots(figsize=(15, 15))
cax = ax.imshow(normalized_rgb_t1)
ax.set_title("The Pacific Palisades in LA after the January 2025 Fires", size=18)
Text(0.5, 1.0, 'The Pacific Palisades in LA after the January 2025 Fires')
We can see that the hills are burned brown, in stark contrast to the green landscape in the lower-right corner.
Calculating Spectral Indices ($t_1$)¶
While we an see the burned area because we know it's there, we could use spectral indexes to discover it. For instance, recall that the formula for NDVI is:
$NDVI = \frac{(nir - red)}{(nir + red)}$
In code, this can be written as
def return_ndvi(data:xr.Dataset) -> xr.DataArray:
"""
Calculate and return NDVI.
"""
# Turn red band into floats
red = data["red"].astype("float")
# Turn near infrared band into floats
nir = data["nir"].astype("float")
# Calculate NDVI
ndvi = (nir - red) / (nir + red)
return ndvi
# Compute NDVI (Normalized Difference Vegetation Index)
ndvi_t1 = return_ndvi(data_t1)
I have written helper functions to calculate the two other indexes we need today.
from spectral_indexes import *
ndwi_t1 = return_ndwi(data_t1)
ibi_t1 = return_ibi(data_t1)
Visualizing Spectral Indices ($t_1$)¶
Using matplotlib, we can plot the NDVI values for T1 like so. What's that huge white blob? It's water. Let's remove it.
plot_single_image_spectral_idx(ndvi_t1, 30, 10, name = "NDVI")
NDWI helps us here.
plot_single_image_spectral_idx(ndwi_t1, 30, 10, name = "NDWI", cmap="Purples")
Using the NDWI, we can filter the water away from our building and vegetation indexes.
water_mask_t1 = ndwi_t1 > 0.1
ndvi_water_masked = np.where(water_mask_t1, np.nan, ndvi_t1)
ibi_water_masked = np.where(water_mask_t1, np.nan, ibi_t1)
Now, we get the following NDVI image. What do you notice?
plot_single_image_spectral_idx(ndvi_water_masked, 30, 10, name = "NDVI")
To find the buildings, we can plot the IBI after water masking. Notice how the Palisades have a much lower IBI than the neighboring area.
plot_single_image_spectral_idx(ibi_water_masked, 30, 10, name = "IBI", cmap="Purples")
Spectral index median values ($t_1$)¶
While we have explored the use of one image, it's better praxis to average values over several images. Here, we are interested in the month that has passed since the fire, i.e. all the $t_1$ items.
item_list_t1 = list(item_collection_t1)
item_list_t1
[<Item id=S2C_11SLT_20250221_0_L2A>, <Item id=S2C_11SLT_20250201_0_L2A>]
We can calculate the NDVI and IBI for all of these. Let's also calculate the NBR to see the burned areas. First, we loop over all the items and calculate each index...
ndvis_t1 = calculate_spectral_index_over_items(item_list_t1, selected_bands, bbox, return_ndvi)
ibis_t1 = calculate_spectral_index_over_items(item_list_t1, selected_bands, bbox, return_ibi)
nbrs_t1 = calculate_spectral_index_over_items(item_list_t1, selected_bands, bbox, return_nbr)
Processing item 1 out of 1
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [01:13<00:00, 12.32s/it]
Processing item 1 out of 1
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [01:07<00:00, 11.19s/it]
Processing item 1 out of 1
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [01:16<00:00, 12.71s/it]
Processing item 1 out of 1
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [01:15<00:00, 12.52s/it]
... then we calculate the median.
%time median_ndvi_t1 = calculate_median_index(ndvis_t1)
%time median_ibi_t1 = calculate_median_index(ibis_t1)
%time median_nbr_t1 = calculate_median_index(nbrs_t1)
Concatenating Spectral Index images. Calculating the means, this will take a while. CPU times: user 19 ms, sys: 4.45 ms, total: 23.4 ms Wall time: 22.7 ms Concatenating Spectral Index images. Calculating the means, this will take a while. CPU times: user 16 ms, sys: 1.49 ms, total: 17.5 ms Wall time: 17.5 ms Concatenating Spectral Index images. Calculating the means, this will take a while. CPU times: user 15.2 ms, sys: 2.11 ms, total: 17.4 ms Wall time: 17.4 ms Concatenating Spectral Index images. Calculating the means, this will take a while. CPU times: user 17.4 ms, sys: 3.02 ms, total: 20.5 ms Wall time: 20.5 ms
Behind the scenes, we have been using xarray. However, at this point we transition into numpy. We can use a very simple dummy function for this. However, we need to flip the data using np.flipud() in order to get it right in numpy.
def xr_spectral_index_data_to_np(xr_data:xr.DataArray) -> np.ndarray:
"""
Turn xr.DataArray to np.ndarray and flip the results to make map face south to north.
"""
return np.flipud(xr_data.to_numpy())
median_ndvi_t1_np = xr_spectral_index_data_to_np(median_ndvi_t1)
median_ibi_t1_np = xr_spectral_index_data_to_np(median_ibi_t1)
median_nbr_t1_np = xr_spectral_index_data_to_np(median_nbr_t1)
Plot Spectral Medians ($t_1$)¶
Let's plot the result, starting with the median NDVI.
median_ndvi_t1_np_water_masked = np.where(np.flipud(water_mask_t1), np.nan, median_ndvi_t1_np)
plot_territory(median_ndvi_t1_np_water_masked, 30, 10, 'Greens', 'Median NDVI T1')
Next, the IBI.
median_ibi_t1_np_water_masked = np.where(np.flipud(water_mask_t1), np.nan, median_ibi_t1_np)
plot_territory(median_ibi_t1_np_water_masked, 30, 10, 'Purples', 'Median IBI T1')
Finally, we get to the NBR. Notice how stark the contrast is between the affected areas and the neighboring area that was spared from the fire.
median_nbr_t1_np_water_masked = np.where(np.flipud(water_mask_t1), np.nan, median_nbr_t1_np)
plot_territory(median_nbr_t1_np_water_masked, 30, 10, 'Reds_r', 'Median NBR T1')
Part 2: Hands-on¶
Spectral Index change detection ($t_1$ - $t_0$)¶
Having calculated our indexes for $t_1$, we now have a starting point for seeing the impact of the Palisades Fire. For this purpose, we will re-calculate the indexes, but this time for a $t_0$ prior to the fire. Then, we will subtract these $t_0$ values from our $t_1$ values.
Choosing your $t_0$¶
dates_t0 = "2024-12-01/2025-01-06"
Prompt: How would you search for data from this period?
%%time
item_search_t0 = sentinel_client.search(
collections=[collection],
datetime=dates_t0,
bbox=bbox,
query=["s2:nodata_pixel_percentage<20",
"s2:degraded_msi_data_percentage<20",
"eo:cloud_cover<20"],
max_items = 5)
CPU times: user 382 µs, sys: 10 µs, total: 392 µs Wall time: 395 µs
print_item_search_attributes(item_search_t0)
2 items found: ID: S2A_11SLT_20250102_0_L2A Cloud cover (%): 3.015763 Missing pixels (%): 7e-06 Missing band data (%): 0 Image area (km^2): 1.17 ID: S2B_11SLT_20241218_0_L2A Cloud cover (%): 0.004997 Missing pixels (%): 0 Missing band data (%): 0.0213 Image area (km^2): 1.17
item_collection_t0 = item_search_t0.item_collection()
items_t0 = list(item_collection_t0)
items_t0[0].properties['datetime']
'2025-01-02T18:45:02.738000Z'
Detour: Fixing Item Properties ($t_0$)¶
Before we dive deeper into the data, we need to take a brief detour. While preparing this tutorial, I noticed that newer Sentinel-2 data threw an error with older versions of pystac while older Sentinel-2 data caused trouble with newer versions of pystac. The following code blocks resolve these issues. In brief, the standards for storing projection data seem to have changed.
def print_item_properties(item, string:str="proj"):
for key, value in item.properties.items():
if string in key:
print(f"{key}:{value}")
def fix_item_proj_properties(source, target, string:str="proj"):
for key, value in source.properties.items():
if string in key:
target.properties[key] = value
return target
Old way.
print_item_properties(items_t0[0])
proj:epsg:32611
New way.
print_item_properties(min_cloud_t1)
proj:code:EPSG:32611
proj:centroid:{'lat': 33.83606, 'lon': -118.56814}
Loop over old items and add projection metadata from newer item.
items_t0 = [fix_item_proj_properties(min_cloud_t1, item, "proj") for item in list(items_t0)]
items_t0
[<Item id=S2A_11SLT_20250102_0_L2A>, <Item id=S2B_11SLT_20241218_0_L2A>]
Load Item ($t_0$)¶
Okay, back to business.
Prompt: Filter your $t_0$ items for the one with minimum cloud cover. Then, load your data using stac_load.
min_cloud_t0 = get_item_with_min_attribute(items_t0, attr='eo:cloud_cover')
data_t0 = stac_load([min_cloud_t0],
bands = selected_bands,
bbox=intersection_poly.bounds,
chunks={},
resolution=10,
# Could be as low as 0.00009009, but we would run into memory errors
progress=tqdm).isel(time=0)
data_t0
<xarray.Dataset> Size: 6MB
Dimensions: (y: 489, x: 959)
Coordinates:
* y (y) float64 4kB 3.771e+06 3.771e+06 ... 3.766e+06 3.766e+06
* x (x) float64 8kB 3.521e+05 3.522e+05 ... 3.617e+05 3.617e+05
spatial_ref int32 4B 32611
time datetime64[ns] 8B 2024-12-18T18:45:03.766000
Data variables:
swir16 (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
swir22 (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
nir (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
red (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
green (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>
blue (y, x) uint16 938kB dask.array<chunksize=(489, 959), meta=np.ndarray>- y: 489
- x: 959
- y(y)float643.771e+06 3.771e+06 ... 3.766e+06
- units :
- metre
- resolution :
- -10.0
- crs :
- EPSG:32611
array([3771225., 3771215., 3771205., ..., 3766365., 3766355., 3766345.])
- x(x)float643.521e+05 3.522e+05 ... 3.617e+05
- units :
- metre
- resolution :
- 10.0
- crs :
- EPSG:32611
array([352145., 352155., 352165., ..., 361705., 361715., 361725.])
- spatial_ref()int3232611
- spatial_ref :
- PROJCRS["WGS 84 / UTM zone 11N",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 120°W and 114°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - Alberta; British Columbia (BC); Northwest Territories (NWT); Nunavut. Mexico. United States (USA)."],BBOX[0,-120,84,-114]],ID["EPSG",32611]]
- crs_wkt :
- PROJCRS["WGS 84 / UTM zone 11N",BASEGEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["UTM zone 11N",METHOD["Transverse Mercator",ID["EPSG",9807]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",-117,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["Scale factor at natural origin",0.9996,SCALEUNIT["unity",1],ID["EPSG",8805]],PARAMETER["False easting",500000,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["(E)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["(N)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Navigation and medium accuracy spatial referencing."],AREA["Between 120°W and 114°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - Alberta; British Columbia (BC); Northwest Territories (NWT); Nunavut. Mexico. United States (USA)."],BBOX[0,-120,84,-114]],ID["EPSG",32611]]
- semi_major_axis :
- 6378137.0
- semi_minor_axis :
- 6356752.314245179
- inverse_flattening :
- 298.257223563
- reference_ellipsoid_name :
- WGS 84
- longitude_of_prime_meridian :
- 0.0
- prime_meridian_name :
- Greenwich
- geographic_crs_name :
- WGS 84
- horizontal_datum_name :
- World Geodetic System 1984 ensemble
- projected_crs_name :
- WGS 84 / UTM zone 11N
- grid_mapping_name :
- transverse_mercator
- latitude_of_projection_origin :
- 0.0
- longitude_of_central_meridian :
- -117.0
- false_easting :
- 500000.0
- false_northing :
- 0.0
- scale_factor_at_central_meridian :
- 0.9996
- GeoTransform :
- 352140 10 0 3771230 0 -10
array(32611, dtype=int32)
- time()datetime64[ns]2024-12-18T18:45:03.766000
array('2024-12-18T18:45:03.766000000', dtype='datetime64[ns]')
- swir16(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - swir22(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - nir(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - red(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - green(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray - blue(y, x)uint16dask.array<chunksize=(489, 959), meta=np.ndarray>
- nodata :
- 0
Array Chunk Bytes 915.92 kiB 915.92 kiB Shape (489, 959) (489, 959) Dask graph 1 chunks in 4 graph layers Data type uint16 numpy.ndarray
- yPandasIndex
PandasIndex(Index([3771225.0, 3771215.0, 3771205.0, 3771195.0, 3771185.0, 3771175.0, 3771165.0, 3771155.0, 3771145.0, 3771135.0, ... 3766435.0, 3766425.0, 3766415.0, 3766405.0, 3766395.0, 3766385.0, 3766375.0, 3766365.0, 3766355.0, 3766345.0], dtype='float64', name='y', length=489)) - xPandasIndex
PandasIndex(Index([352145.0, 352155.0, 352165.0, 352175.0, 352185.0, 352195.0, 352205.0, 352215.0, 352225.0, 352235.0, ... 361635.0, 361645.0, 361655.0, 361665.0, 361675.0, 361685.0, 361695.0, 361705.0, 361715.0, 361725.0], dtype='float64', name='x', length=959))
Prompt: Plot an RGB version of the image.
normalized_rgb_t0 = normalize_to_rgb(data_t0)
normalized_rgb_t0.shape
(489, 959, 3)
fig, ax = plt.subplots(figsize=(15, 15))
cax = ax.imshow(normalized_rgb_t0)
ax.set_title("The Pacific Palisades in LA before the January 2025 Fires", size=18)
Text(0.5, 1.0, 'The Pacific Palisades in LA before the January 2025 Fires')
fig, ax = plt.subplots(figsize=(15, 15))
cax = ax.imshow(normalized_rgb_t1)
ax.set_title("The Pacific Palisades in LA After the January 2025 Fires", size=18)
Text(0.5, 1.0, 'The Pacific Palisades in LA After the January 2025 Fires')
Spectral indexes for $t_0$¶
Prompt: Now, calculate the NDVI, NDWI, IBI, and NBR for all items at $t_0$.
ndvis_t0 = calculate_spectral_index_over_items(items_t0, selected_bands, bbox, return_ndvi)
ibis_t0 = calculate_spectral_index_over_items(items_t0, selected_bands, bbox, return_ibi)
nbrs_t0 = calculate_spectral_index_over_items(items_t0, selected_bands, bbox, return_nbr)
ndwis_t0 = calculate_spectral_index_over_items(items_t0, selected_bands, bbox, return_ndwi)
Processing item 1 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:07<00:00, 1.28s/it]
Processing item 2 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:05<00:00, 1.13it/s]
Processing item 1 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00, 1.85it/s]
Processing item 2 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00, 1.77it/s]
Processing item 1 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00, 1.55it/s]
Processing item 2 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00, 1.71it/s]
Processing item 1 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00, 1.73it/s]
Processing item 2 out of 2
100%|████████████████████████████████████████████████████████████████████████████| 6/6 [00:03<00:00, 1.62it/s]
Prompt: Calculate the median for each index.
%time median_ndvi_t0 = calculate_median_index(ndvis_t0)
%time median_ibi_t0 = calculate_median_index(ibis_t0)
%time median_nbr_t0 = calculate_median_index(nbrs_t0)
%time median_ndwi_t0 = calculate_median_index(ndwis_t0)
Concatenating Spectral Index images. Calculating the means, this will take a while. CPU times: user 32 ms, sys: 7.81 ms, total: 39.8 ms Wall time: 39.3 ms Concatenating Spectral Index images. Calculating the means, this will take a while. CPU times: user 29.6 ms, sys: 961 µs, total: 30.6 ms Wall time: 30.6 ms Concatenating Spectral Index images. Calculating the means, this will take a while. CPU times: user 29.7 ms, sys: 3.8 ms, total: 33.5 ms Wall time: 33.5 ms Concatenating Spectral Index images. Calculating the means, this will take a while. CPU times: user 30.2 ms, sys: 3.03 ms, total: 33.2 ms Wall time: 33.2 ms
Prompt: Convert these medians from xarray to numpy.
median_ndvi_t0_np = xr_spectral_index_data_to_np(median_ndvi_t0)
median_nbr_t0_np = xr_spectral_index_data_to_np(median_nbr_t0)
median_ibi_t0_np = xr_spectral_index_data_to_np(median_ibi_t0)
median_ndwi_t0_np = xr_spectral_index_data_to_np(median_ndwi_t0)
Prompt: Plot each of these medians. Remember to filter for water!
water_mask_t0 = median_ndwi_t0_np > 0.1
median_ndvi_t0_np_water_masked = np.where(water_mask_t0, np.nan, median_ndvi_t0_np)
plot_territory(median_ndvi_t0_np_water_masked, 30, 10, 'Greens', 'Median NDVI T0')
median_ibi_t0_np_water_masked = np.where(water_mask_t0, np.nan, median_ibi_t0_np)
plot_territory(median_ibi_t0_np_water_masked, 30, 10, 'Purples', 'Median IBI T0')
median_nbr_t0_np_water_masked = np.where(water_mask_t0, np.nan, median_nbr_t0_np)
plot_territory(median_nbr_t0_np_water_masked, 30, 10, 'Reds_r', 'NBR T0')
Building Filter¶
Prompt: We are mainly interested in damage for buildings. For that purpose:
- Setup a building filter similar to water.
- Mask that filter for water.
- Then plot this "buildings but no water".
building_filter = median_ibi_t0_np > -.25
buildings = np.where(building_filter, median_ibi_t0_np, np.nan)
buildings_water_masked = np.where(np.flipud(water_mask_t1), np.nan, buildings)
plot_territory(buildings_water_masked, 30, 10, 'Purples', 'Buildings T0')
Calculating the Spectral differences¶
Now we are approaching the grand finale! We want to calculate the differences between $t_1$ and $t_0$ values. I'll show how with NDVI.
ndvi_difference = median_ndvi_t1 - median_ndvi_t0
ndvi_difference_np = xr_spectral_index_data_to_np(ndvi_difference)
ndvi_difference_np[ndvi_difference_np>0] = 0
plot_territory(ndvi_difference_np, 40, 10, 'YlGn', 'Negative NDVI Difference')
Prompt: Now do the same with the NBR.
nbrs_difference = median_nbr_t1 - median_nbr_t0
nbrs_difference_np = xr_spectral_index_data_to_np(nbrs_difference)
nbrs_difference_np[nbrs_difference_np>0] = 0
nbrs_difference_np_water_masked = np.where(np.flipud(water_mask_t1), np.nan, nbrs_difference_np)
plot_territory(nbrs_difference_np_water_masked, 40, 10, 'Reds_r', 'Negative NBR Difference')
Okay, the final "mask".
Prompt: Use both the NBR filter and our $t_0$ buildings to map buildings that sustained fire damage.
building_mask = np.isnan(buildings)
burned_buildings = np.where(building_mask, np.nan, nbrs_difference_np)
burned_buildings = np.where(nbrs_difference_np < -.25, burned_buildings, np.nan)
burned_buildings = np.where(water_mask_t0, np.nan, burned_buildings)
plot_territory(burned_buildings, 40, 10, 'Reds_r', 'Negative NBR Difference')
Plotting it all¶
Now we can return to the image at the start.
Prompt: Use the code below to plot the outputs from your experiments above. burned_buildings should be an array with NBR values for building pixels and nan elsewhere. normalized_rgb_t1 should be an array with RGB-values normalized to the 0, 1 range.
# Create the figure and plot the base image
fig, ax = plt.subplots(figsize=(15, 15))
base = ax.imshow(normalized_rgb_t1, alpha=0.35) # The background image
ax.set_title("Burned Structures During the 2025 LA Palisades Fires", size=18)
# Overlay the second dataset on top
overlay = plot_overlay(ax, burned_buildings, cmap="YlOrRd", alpha=1)
# Add a colorbar for the overlay
cbar = plt.colorbar(overlay, ax=ax, fraction=0.02, pad=0.02)
cbar.ax.tick_params(labelsize=12)
cbar.set_label("Differenced NBR for buildings", size=14)
fig.savefig("img/burned_structures_highres.png", dpi=300, bbox_inches="tight")
Comparing with building footprints¶
How well did we do? We can compare with footprints of buildings provided by the LA county in order to evaluate.
la_buildings = gpd.read_file("data/2023_Buildings_with_DINS_data.geojson")
la_buildings.head(3)
| OBJECTID | CODE | BLD_ID | HEIGHT | ELEV | SOURCE | DATE_ | STATUS | OLD_BLD_ID | AREA | DAMAGE | STRUCTURET | Shape__Area | Shape__Length | geometry | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Building | 405063833902 | 29.21 | 95.95 | LARIAC2 | 2008 | Unchanged | None | 1062.196900 | None | None | 144.039062 | 57.653066 | POLYGON Z ((-118.51685 34.03063 0, -118.5168 3... |
| 1 | 2 | Building | 405077833794 | 16.68 | 54.91 | LARIAC2 | 2008 | Unchanged | None | 1339.697198 | None | None | 181.675781 | 59.368595 | POLYGON Z ((-118.51679 34.03032 0, -118.51674 ... |
| 2 | 3 | Building | 404932833728 | 2.12 | 51.39 | LARIAC2 | 2008 | Unchanged | None | 357.872695 | None | None | 48.527344 | 28.082028 | POLYGON Z ((-118.51735 34.03008 0, -118.5173 3... |
# Classify damage into three categories.
def classify_damage(damage):
if damage == 'No Damage' or damage is None:
return 'Undamaged'
elif damage == 'Inaccessible':
return 'Inaccessible'
else:
return 'Damaged'
# Add a new column for the classified damage category.
la_buildings["damage_category"] = la_buildings["DAMAGE"].apply(classify_damage)
Prompt: Replace burned_buildings in the code below with your array with damage to buildings. How did you do?
plot_buildings_and_raster(la_buildings, burned_buildings)
Source: